package com.monkeygroup.mygoplus.common.utils;

import android.util.Base64;

import java.security.MessageDigest;

/**
 * Created by admin on 2017/8/6.
 */

public class EncryptUtil {


    private static final String MYGO_ENCRYPT_KEY = "mygo0727app";

    /**
     * Passport 加密函数
     *
     * @param
     * @param
     *
     * @return string          原字串经过私有密匙加密后的结果
     * @throws
     */
    public static String encrypt(String txt) {
        // 使用随机数发生器产生 0~32000 的值并 MD5()
        String rand = ""+(int)(Math.random()*32000);
        String encrypt_key = getMD5(rand);
        // 变量初始化
        int ctr = 0;
        String tmp = "";
        // for 循环，$i 为从 0 开始，到小于 $txt 字串长度的整数
        for (int i = 0; i < txt.length(); i++) {
            // 如果 $ctr = $encrypt_key 的长度，则 $ctr 清零
            ctr = ctr == encrypt_key.length() ? 0 : ctr;
            // $tmp 字串在末尾增加两位，其第一位内容为 $encrypt_key 的第 $ctr 位，
            // 第二位内容为 $txt 的第 $i 位与 $encrypt_key 的 $ctr 位取异或。然后 $ctr = $ctr + 1
            // tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);
            tmp = tmp + encrypt_key.charAt(ctr) + (char)((txt.charAt(i) ^ encrypt_key.charAt(ctr++)));
        }
        // 返回结果，结果为 self::passkey() 函数返回值的 base64 编码结果
        String pass = passkey(tmp, MYGO_ENCRYPT_KEY);
        String b64Pass = new String(Base64.encode(pass.getBytes(), Base64.URL_SAFE|Base64.NO_WRAP));
        return b64Pass.trim();
    }

    /**
     * Passport 解密函数
     *
     * @param
     * @param
     *
     * @return      string          字串经过私有密匙解密后的结果
     */
    public static String decrypt(String txt) {
        // $txt 的结果为加密后的字串经过 base64 解码，然后与私有密匙一起，
        // 经过 self::passkey() 函数处理后的返回值
        txt = passkey(new String(Base64.decode(txt.getBytes(), Base64.URL_SAFE|Base64.NO_WRAP)), MYGO_ENCRYPT_KEY);
        // 变量初始化
        String tmp = "";
        // for 循环，$i 为从 0 开始，到小于 $txt 字串长度的整数
        for (int i = 0; i < txt.length(); i++){
            // $tmp 字串在末尾增加一位，其内容为 $txt 的第 $i 位，
            // 与 $txt 的第 $i + 1 位取异或。然后 $i = $i + 1
            tmp = tmp + (char)(txt.charAt(i) ^ txt.charAt(++i));
        }
        // 返回 $tmp 的值作为结果
        return tmp;
    }
    /**
     * Passport 密匙处理函数
     *
     * @param
     * @param
     *
     * @return      string          处理后的密匙
     */
    private static String passkey(String txt, String encrypt_key){
        // 将 $encrypt_key 赋为 $encrypt_key 经 md5() 后的值
        encrypt_key = getMD5(encrypt_key);
        // 变量初始化
        int ctr = 0;
        String tmp = "";
        // for 循环，$i 为从 0 开始，到小于 $txt 字串长度的整数
        for(int i = 0; i < txt.length(); i++){
            // 如果 $ctr = $encrypt_key 的长度，则 $ctr 清零
            ctr = ctr == encrypt_key.length() ? 0 : ctr;
            // $tmp 字串在末尾增加一位，其内容为 $txt 的第 $i 位，
            // 与 $encrypt_key 的第 $ctr + 1 位取异或。然后 $ctr = $ctr + 1
            tmp = tmp + (char)(txt.charAt(i) ^ encrypt_key.charAt(ctr++));
        }
        // 返回 $tmp 的值作为结果
        return tmp;
    }

    public static String getMD5(String str) {
        MessageDigest md5 = null;
        try {
            md5 = MessageDigest.getInstance("MD5");
        } catch (Exception e) {
            e.printStackTrace();
            return "";
        }

        char[] charArray = str.toCharArray();
        byte[] byteArray = new byte[charArray.length];

        for (int i = 0; i < charArray.length; i++) {
            byteArray[i] = (byte) charArray[i];
        }

        byte[] md5Bytes = md5.digest(byteArray);
        StringBuffer hexValue = new StringBuffer();

        for (int i = 0; i < md5Bytes.length; i++) {
            int val = ((int) md5Bytes[i]) & 0xff;
            if (val < 16) {
                hexValue.append("0");
            }
            hexValue.append(Integer.toHexString(val));
        }
        return hexValue.toString();
    }
}
